package com.banesco.precargadepositos.interfaz.presentadores;

import javax.microedition.global.Formatter;

import com.banesco.precargadepositos.interfaz.recursos.EtiquetasResource;
import com.banesco.precargadepositos.interfaz.recursos.MensajeResource;

import com.banesco.precargadepositos.interfaz.recursos.EstadosPreCargaResource;

import net.rim.device.api.i18n.ResourceBundle;
import net.rim.device.api.system.RadioInfo;
import net.rim.device.api.system.WLANInfo;
import net.rim.device.api.util.StringUtilities;



public abstract class PresentadorBase implements Runnable, EtiquetasResource, MensajeResource, EstadosPreCargaResource {

	public static ResourceBundle _res = ResourceBundle.getBundle(EtiquetasResource.BUNDLE_NAME);
	public static ResourceBundle _recursoMsj = ResourceBundle.getBundle(MensajeResource.BUNDLE_NAME);
	public static ResourceBundle _estadosPreCarga= ResourceBundle.getBundle(EstadosPreCargaResource.BUNDLE_NAME);
	
	
	/**
	 * Metodo que convierte un numero a string con el formato deseado
	 * 
	 * @param number valor de la parte entera del numero
	 * @param decimals valor de la parte decimal del numero
	 * @param digitGrouping simbolo separador de los decimales
	 * 
	 * @return string con el numero formateado
	 */
	public static String formatNumber(double number, int decimals, String digitGrouping){
		Formatter f = new Formatter("en");
		String rawNumber = f.formatNumber(number, decimals+1);
				
		String rawIntString = rawNumber.substring(0, rawNumber.indexOf(".")); //Basically intString without digit grouping
		StringBuffer intString = new StringBuffer();
		StringBuffer decString = new StringBuffer(rawNumber.substring(rawNumber.indexOf(".")+1));
		StringBuffer formattedNumber = new StringBuffer();
		int workingVal = 0;
		int newNum = 0;
		boolean roundNext;

		int grouplen = 0;
		int firstDigit;
		if(rawIntString.charAt(0) == '-'){
			firstDigit = 1;
		}else{
			firstDigit = 0;
		}
		for(int n=rawIntString.length()-1;n>=firstDigit;n--){
			intString.insert(0, rawIntString.substring(n, n+1));
			grouplen++;
			if(grouplen == 3 && n>firstDigit){
				intString.insert(0, digitGrouping);
				grouplen = 0;
			}
		}

		workingVal = Integer.parseInt(String.valueOf(decString.charAt(decString.length()-1)));
		if(workingVal>=5){
			roundNext = true;
		}else{
			roundNext = false;
		}
		
		for(int n=decString.length()-2;n>=0;n--){
			workingVal = Integer.parseInt(String.valueOf(decString.charAt(n)));
			if(roundNext == true){
				newNum = workingVal + 1;
				if(newNum == 10){
					roundNext = true;
					newNum = 0;
				}else{
					roundNext = false;
				}
				formattedNumber.insert(0, newNum);
			}else{
				formattedNumber.insert(0, workingVal);
			}
		}
		
		formattedNumber.insert(0, ",");
		for(int n=intString.length()-1;n>=0;n--){
			try{
				workingVal = Integer.parseInt(String.valueOf(intString.charAt(n)));
			}catch(Exception e){
				formattedNumber.insert(0, intString.charAt(n));
				continue;
			}
			if(roundNext == true){
				newNum = workingVal + 1;
				if(newNum == 10){
					roundNext = true;
					newNum = 0;
				}else{
					roundNext = false;
				}
				formattedNumber.insert(0, newNum);
			}else{
				formattedNumber.insert(0, workingVal);
			}	
		}
		
		if(roundNext == true){
			formattedNumber.insert(0, 1);
			
		}	
		
		if(firstDigit == 1) formattedNumber.insert(0, rawIntString.charAt(0));
		
		if(digitGrouping.length() > 0){
			if(formattedNumber.toString().indexOf(".") == -1){
				//no decimal
				if(formattedNumber.toString().indexOf(digitGrouping) > 3+firstDigit){
					formattedNumber.insert(1+firstDigit, digitGrouping);
				}
				
				if(formattedNumber.toString().length() == 4+firstDigit){
					formattedNumber.insert(1+firstDigit, digitGrouping);
				}
			}else{
				//no decimal
				if(formattedNumber.toString().indexOf(digitGrouping) > 3+firstDigit){
					formattedNumber.insert(1+firstDigit, digitGrouping);
				}
				
				String intportion = formattedNumber.toString().substring(0, formattedNumber.toString().indexOf("."));
				if(intportion.length() == 4+firstDigit){
					formattedNumber.insert(1+firstDigit, digitGrouping);
				}
			}
		}

		String tmp = formattedNumber.toString();
		int newLength = tmp.length();
		for(int n=tmp.length()-1;n>=0;n--){
			if(tmp.substring(n, n+1).equalsIgnoreCase("0")){
				newLength--;
			}else{
				if(tmp.substring(n, n+1).equalsIgnoreCase(".")) newLength--;
				break;
			}
		}
		formattedNumber.setLength(newLength);

		return formattedNumber.toString();
	}
	
	
	/**
	 * Metodo que substituye los primeros 4 digitos de un string por asteriscos
	 * @param source string que se quiere enmascarar
	 * @return
	 */
	public String enmascarar(String source)
	{	
	
		StringBuffer sb = new StringBuffer();

		if(source != null){
			sb.append("****");
			sb.append(source.substring(source.length()-4, source.length()));
		}
		
        return sb.toString();
	}
	
	
	/**
	 * Stub abstracto que sera heredada por todos los presentadores que se encarga
	 * de validar los campos dentro de cada pantalla
	 * @return
	 */
	public abstract boolean CamposValidos();
	
	
	/**
	 * Metodo que valida que la cadena ingresada sea numerica
	 * @param numero numero a validar
	 * @return true si es valido false sino
	 */
	public boolean esNumero(String numero){
		
		try {
			Long.parseLong(numero);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
	
	/**
	 * Metodo que formatea un string con un monto para que este pueda ser transmitido por el proxy
	 * 
	 * @param monto monto que se desea formatear
	 * @param otroMonto
	 * @return
	 */
	public String formatearMontoParaProxy(String monto, boolean otroMonto){
		String retorno = monto;
		String decimales = "";

		if(otroMonto){
	       if(monto.indexOf(',')!=-1){  
	    	   int aux = retorno.length() - 1 - retorno.indexOf(',');
	    	   
	    	   decimales = monto.substring(monto.indexOf(',') + 1, monto.length());
	    	   
	    	   for(int i = aux ; i < 2 ; i++){
	    		   decimales += "0";
	    	   }
	    	   
	    	   retorno = monto.substring(0, monto.indexOf(',')) + decimales;
	       } else {
	    	   retorno += "00"; 
	       }
		} else {
			monto = StringUtilities.removeChars(monto, "-");
			monto = StringUtilities.removeChars(monto, ".");
			monto = StringUtilities.removeChars(monto, ",");
		}
		
		return retorno;
	}
	
	
	/**
	 * Metodo que determina si el celular tiene cobertura de datos
	 * @return
	 */
	public boolean HayCobertura()
	{
		return ((RadioInfo.getState() == RadioInfo.STATE_ON)
				&& (RadioInfo.getSignalLevel() != RadioInfo.LEVEL_NO_COVERAGE) 
				&& RadioInfo.isDataServiceOperational()) 
				|| WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED;
	}
	

}
